//https://babeljs.io/repl#?browsers=ie%2011&build=&builtIns=usage&corejs=3.21&spec=false&loose=false&code_lz=GYVwdgxgLglg9mAVAAgE4FMCGATAFASmQG9kB6U5QDbzAS6MCx5QMB1AAOUCo5QX8VAHU0DAlQJyVAEI0CxNZoAuEzgChkE5AE8Y6ADbZkAcgBuIdEoDc4yTPmLVMKBu2TpshcrBxsJshUDlcoFdlQDD_gZPjAX4otAPArIXgeetAQmtAcQTABiU9BUBGHUAdBUAja1EAX1E5dChkI2QAXjQsPHxtIwA6MHQADygCTSA&debug=false&forceAllTransforms=false&shippedProposals=false&circleciRepo=&evaluate=false&fileSize=false&timeTravel=false&sourceType=module&lineWrap=true&presets=env%2Cstage-2&prettier=false&targets=&version=7.17.11&externalPlugins=&assumptions=%7B%7D

/*
function* read() {
  let a = yield 'vue';
  console.log(a, 'a')
  let b = yield 'vite';
  console.log(b, 'b')
  let c = yield 'node';
  console.log(c, 'c')
}

let it = read(); // 返回一个迭代器
console.log(it.next()); // 每次调用next 遇到yield就停止
console.log(it.next('aaa')); // 调用next的时候可以给上一次yield的结果赋值, 如果没有上一次则传参无意义
console.log(it.next('bbb'));
console.log(it.next('ccc'));
*/

const regeneratorRuntime = {
  mark(gen) {
    return gen
  },
  wrap(iteratorFn) { // 此函数iteratorFn会执行多次
    const _context = {
      next: 0,
      sent: null, // 下一次调用next的时候 传递的参数 会赋予给上一次的返回值
      done: false,
      stop() {
        _context.done = true
      }
    }
    return { // it
      next(v) { // value 就是上一次yield的返回值
        _context.sent = v; // 每次调用next时会将用户的参数保存到sent上
        let value = iteratorFn(_context);
        return { value, done: _context.done }
      }
    }
  }
}

var _marked = /*#__PURE__*/regeneratorRuntime.mark(read);

function read() {
  var a, b, c;
  return regeneratorRuntime.wrap(function read$(_context) {
    while (1) { // while(true) 表示这个东西是一个状态机，根据状态的变化实现对应的逻辑， 这个逻辑会走多次
      switch (_context.prev = _context.next) {
        case 0:
          _context.next = 2;
          return 'vue';

        case 2:
          a = _context.sent;
          console.log(a, 'a');
          _context.next = 6;
          return 'vite';

        case 6:
          b = _context.sent;
          console.log(b, 'b');
          _context.next = 10;
          return 'node';

        case 10:
          c = _context.sent;
          console.log(c, 'c');

        case 12:
        case "end":
          return _context.stop();
      }
    }
  }, _marked);
}

let it = read()
console.log(it.next());
console.log(it.next('aaa'));
console.log(it.next('bbb'));
console.log(it.next('ccc'));

// wrap 的使用会传入编译后的函数（变成了switch case的模式将一个函数进行了拆分，根据_context.next 来决定执行对应的逻辑）
//  wrap函数的返回结果是迭代器迭代器要有next方法 （next函数）
// 每次用户会调用next方法，传入对应的值， 这个值会被保留在_context.sent上， 走下一次调用函数的时候将其取出赋值给变量
